package com.idroc.message;

import java.util.Map;

/**
 * 消息服务类
 * @author 赤脚詹(yuyoo4j@163.com)
 * @date Aug 17, 2009 4:12:17 PM 
 * @memo:提供消息服务, 包括发送消息,注册消息处理器将消息服务捕获的消息分发给消息处理器
 */
public interface MessageService {
	
	/**
	 * 初始化
	 * @param config -- 配置信息
	 * <p>
	 * 说明:<br> key 为属性, value为属性值
	 * </p>
	 */
	void init(Map<String, String> config);
	
	/**
	 * 启动消息服务
	 * <p>
	 * 说明:<br>  
	 * </p>
	 */
	void start();
	
	/**
	 * 停止消息服务
	 * <p>
	 * 说明:<br>  
	 * </p>
	 */
	void stop();
	
	/**
	 * 暂停消息服务  
	 * <p>
	 * 说明:<br>  
	 * </p>
	 */
	void pin();

	/**
	 * 解除暂停
	 * <p>
	 * 说明:<br>  
	 * </p>
	 */
	void unpin();
	
	/**
	 * 是否已启动
	 * @return -- true or false
	 * <p>
	 * 说明:<br>  true为已经启动了消息服务, false表明还未启动消息服务
	 * </p>
	 */
	boolean isStarted();
	
	/**
	 * 是否已停止
	 * @return -- true or false
	 * <p>
	 * 说明:<br>   true为已经停止了消息服务, false表明还未停止消息服务
	 * </p>
	 */
	boolean isStopped();
	
	/**
	 * 是否暂停
	 * @return -- true or false
	 * <p>
	 * 说明:<br> true为已经暂停了消息服务, false为未暂停消息服务
	 * </p>
	 */
	boolean isPinned(); 
	
	/**
	 * 在当前消息服务根据消息类注册一个消息处理器
	 * @param msgClazz -- 消息类
	 * @param handler -- 消息处理器
	 * <p>
	 * 说明:<br> 消息服务的消息由消息处理器处理. 注册成功,消息处理器会发生绑定事件(onAttached)
	 * </p>
	 */
	void registerMsgHandler(Class<? extends Message> msgClazz, MessageHandler handler);
	
	/**
	 * 在当前消息服务根据消息类注销一个消息处理器
	 * @param msgClazz -- 消息类
	 * @return -- 消息处理器
	 * <p>
	 * 说明:<br> 如果存在消息处理器, 成功注销后消息处理器会发生释放事件(onReleased).
	 * </p>
	 */
	MessageHandler unregisterMsgHandler(Class<? extends Message> msgClazz);
	
	/**
	 * 查找某个消息类的消息处理器
	 * @param msgClazz -- 消息类
	 * @return -- 消息处理器
	 * <p>
	 * 说明:<br> 如果消息服务存在某个消息类的消息处理器,就返回该对象.
	 * </p>
	 */
	MessageHandler findMsgHandler(Class<? extends Message> msgClazz);
	
	/**
	 * 检查是否存在某个消息处理器
	 * @param handler -- 消息处理器
	 * @return -- true or false
	 * <p>
	 * 说明:<br>  true为在当前消息服务存在该消息处理器
	 * </p>
	 */
	boolean hasMsgHandler(MessageHandler handler);
}
